<!--
 * @Descripttion: 
 * @version: 
 * @Author: Zuo
 * @Date: 2021-07-30 15:26:01
 * @LastEditors: Zuo
 * @LastEditTime: 2021-07-31 09:04:22
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
       /*
        3.改变promise状态和指定回调函数谁先谁后?
        (1)都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调
        (2)如何先改状态再指定回调?
        ①在执行器中直接调用resolve()/reject()
        ②延迟更长时间才调用then()
        (3)什么时候才能得到数据?
        ①如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据
        ②如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据

        then里的回调是异步执行的。
        */

        // 常规: 先指定回调函数, 后改变的状态
        new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(1) // 后改变的状态(同时指定数据), 异步执行回调函数
            }, 1000);
        }).then(// 先指定回调函数, 保存当前指定的回调函数
            value => {
            },
            reason => {
                console.log('reason', reason)
            }
        )

        // 如何先改状态, 后指定回调函数
        new Promise((resolve, reject) => {
            resolve(1) // 先改变的状态(同时指定数据)
        }).then(// 后指定回调函数, 异步执行回调函数
            value => {
                console.log('value2', value)
            },
            reason => {
                console.log('reason2', reason)
            }
        )
        console.log('-------')

        const p = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('我异步了，但还是在value3 前面')
                resolve(1) // 后改变的状态(同时指定数据), 异步执行回调函数
            }, 1000);
        })

        setTimeout(() => {
            p.then(
                value => {
                    console.log('value3', value)
                },
                reason => {
                    console.log('reason3', reason)
                }
            )
        }, 1100);

    </script>
</body>
</html>